package com.ucode.hrm.controller;

import lombok.Data;
import org.apache.poi.ss.usermodel.*; // 导入POI库用于处理Excel文件
import org.springframework.web.bind.annotation.*; // Spring Web相关注解
import org.springframework.web.multipart.MultipartFile; // 处理文件上传

import java.io.IOException; // 输入输出异常
import java.io.InputStream; // 输入流
import java.text.SimpleDateFormat; // 日期格式化
import java.util.ArrayList; // 动态数组
import java.util.Date; // 日期对象
import java.util.List; // 列表接口

// Excel解析控制器，处理/excel路径下的请求
@RestController
@RequestMapping("/api/excel") // 映射基础路径
public class ExcelParserController {

    // POST请求处理方法，接收上传的Excel文件
    @PostMapping("/parse") // 映射到/api/excel/parse
    public List<ExcelEmployee> parseExcel(@RequestParam("file") MultipartFile file) throws IOException {
        // 调用解析工具类，将文件输入流转为员工对象列表
        return ExcelParser.parse(file.getInputStream());
    }

    // Excel解析工具类（静态内部类）
    static class ExcelParser {
        // 主解析方法，将输入流解析为员工对象列表
        public static List<ExcelEmployee> parse(InputStream inputStream) throws IOException {
            List<ExcelEmployee> employees = new ArrayList<>(); // 创建空列表存储结果
            Workbook workbook = WorkbookFactory.create(inputStream); // 从输入流创建工作簿
            Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表

            // 遍历工作表的每一行（从第1行开始，跳过标题行）
            for (int i = 1; i <= sheet.getLastRowNum(); i++) {
                Row row = sheet.getRow(i); // 获取当前行
                if (row == null) continue; // 跳过空行

                ExcelEmployee employee = new ExcelEmployee(); // 创建新员工对象
                
                // 解析每个单元格并设置到员工对象中
                // 索引对应Excel列：0=A列, 1=B列, 2=C列...
                employee.setSerialNumber(getIntValue(row.getCell(0))); // A列: 序号
                employee.setName(getStringValue(row.getCell(1))); // B列: 姓名
                employee.setNature(getStringValue(row.getCell(2))); // C列: 性质
                employee.setSuperiorUnit(getStringValue(row.getCell(3))); // D列: 上级单位
                employee.setEmploymentUnit(getStringValue(row.getCell(4))); // E列: 用工单位
                employee.setRecruitmentStatus(getStringValue(row.getCell(5))); // F列: 招聘情况
                employee.setArea(getStringValue(row.getCell(6))); // G列: 地区
                employee.setPosition(getStringValue(row.getCell(7))); // H列: 岗位
                employee.setBasicSalary(getDoubleValue(row.getCell(8))); // I列: 基本工资
                employee.setGender(getStringValue(row.getCell(9))); // J列: 性别
                employee.setEmploymentStatus(getStringValue(row.getCell(10))); // K列: 在职状态
                employee.setEntryDate(getDateValue(row.getCell(11))); // L列: 入职日期
                employee.setContractSignMethod(getStringValue(row.getCell(12))); // M列: 合同签署小程序/线下
                employee.setContractExpiryReminder(getStringValue(row.getCell(13))); // N列: 合同到期提醒
                employee.setRenewalCount(getIntValue(row.getCell(14))); // O列: 续签次数
                employee.setResignationDate(getDateValue(row.getCell(15))); // P列: 离职日期
                employee.setEmploymentDays(getIntValue(row.getCell(16))); // Q列: 在职天数
                employee.setContractSigned(getStringValue(row.getCell(17))); // R列: 合同
                employee.setSocialSecurityLocation(getStringValue(row.getCell(18))); // S列: 社保公积金缴纳地
                employee.setJobTitle(getStringValue(row.getCell(19))); // T列: 职位
                employee.setIdNumber(getStringValue(row.getCell(20))); // U列: 身份证号
                employee.setBirthDate(getDateValue(row.getCell(21))); // V列: 出生日期
                employee.setEducation(getStringValue(row.getCell(22))); // W列: 学历
                employee.setEthnicity(getStringValue(row.getCell(23))); // X列: 民族
                employee.setMaritalStatus(getStringValue(row.getCell(24))); // Y列: 婚姻状况
                employee.setHouseholdType(getStringValue(row.getCell(25))); // Z列: 户口性质
                employee.setRegisteredAddress(getStringValue(row.getCell(26))); // AA列: 户籍所在地地址
                employee.setCurrentAddress(getStringValue(row.getCell(27))); // AB列: 现居住地地址
                employee.setEmail(getStringValue(row.getCell(28))); // AC列: 邮箱
                employee.setPersonalPhone(getStringValue(row.getCell(29))); // AD列: 本人联系方法
                employee.setEmergencyContact(getStringValue(row.getCell(30))); // AE列: 第一紧急联系人电话
                employee.setProbationPeriod(getIntValue(row.getCell(31))); // AF列: 试用期
                employee.setProbationEndDate(getDateValue(row.getCell(32))); // AG列: 试用期到期日
                employee.setContractTerm(getIntValue(row.getCell(33))); // AH列: 合同期
                employee.setContractEndDate(getDateValue(row.getCell(34))); // AI列: 合同到期日
                employee.setAge(getIntValue(row.getCell(35))); // AJ列: 年龄
                employee.setIdCopy(getStringValue(row.getCell(36))); // AK列: 身份证复印件
                employee.setMedicalReport(getStringValue(row.getCell(37))); // AL列: 体检报告
                employee.setEducationCertificate(getStringValue(row.getCell(38))); // AM列: 学历证明
                employee.setResignationCertificate(getStringValue(row.getCell(39))); // AN列: 离职证明
                employee.setPhoto(getStringValue(row.getCell(40))); // AO列: 相片
                employee.setBank(getStringValue(row.getCell(41))); // AP列: 银行
                employee.setBankAccount(getStringValue(row.getCell(42))); // AQ列: 银行卡号
                employee.setOtherBankAccount(getStringValue(row.getCell(43))); // AR列: 其他银行卡号
                employee.setEmployerLiabilityInsurance(getStringValue(row.getCell(44))); // AS列: 雇主责任险
                // 可根据需要继续解析剩余列（AT到AU列）...
                
                employees.add(employee); // 将员工对象添加到结果列表
            }
            workbook.close(); // 关闭工作簿释放资源
            return employees; // 返回解析结果
        }

        // 获取单元格字符串值
        private static String getStringValue(Cell cell) {
            if (cell == null) return null; // 空单元格返回null
            
            switch (cell.getCellType()) {
                case STRING: // 文本类型
                    return cell.getStringCellValue().trim(); // 返回去除空格的文本
                case NUMERIC: // 数字类型
                    if (DateUtil.isCellDateFormatted(cell)) { // 检查是否是日期格式
                        // 日期格式转为"yyyy-MM-dd"字符串
                        return new SimpleDateFormat("yyyy-MM-dd").format(cell.getDateCellValue());
                    }
                    // 普通数字转为字符串（避免科学计数法）
                    return String.valueOf((long) cell.getNumericCellValue());
                case BOOLEAN: // 布尔类型
                    return String.valueOf(cell.getBooleanCellValue()); // 转为字符串
                case FORMULA: // 公式类型
                    // 获取公式计算结果
                    return cell.getCellFormula(); 
                default: // 其他类型
                    return ""; // 返回空字符串
            }
        }

        // 获取单元格整数值
        private static Integer getIntValue(Cell cell) {
            if (cell == null) return null; // 空单元格返回null
            
            try {
                // 尝试获取数字值并转为整数
                return (int) cell.getNumericCellValue();
            } catch (Exception e) {
                // 转换失败时尝试从字符串解析
                try {
                    return Integer.parseInt(getStringValue(cell));
                } catch (NumberFormatException ex) {
                    return null; // 解析失败返回null
                }
            }
        }

        // 获取单元格浮点数值
        private static Double getDoubleValue(Cell cell) {
            if (cell == null) return null; // 空单元格返回null
            
            try {
                // 尝试获取数字值
                return cell.getNumericCellValue();
            } catch (Exception e) {
                // 转换失败时尝试从字符串解析
                try {
                    return Double.parseDouble(getStringValue(cell));
                } catch (NumberFormatException ex) {
                    return null; // 解析失败返回null
                }
            }
        }

        // 获取单元格日期值
        private static Date getDateValue(Cell cell) {
            if (cell == null) return null; // 空单元格返回null
            
            try {
                // 检查是否为日期格式
                if (DateUtil.isCellDateFormatted(cell)) {
                    return cell.getDateCellValue(); // 返回日期对象
                }
                // 尝试从字符串解析日期
                String strValue = getStringValue(cell);
                if (strValue != null && !strValue.isEmpty()) {
                    return new SimpleDateFormat("yyyy-MM-dd").parse(strValue);
                }
                return null; // 无法解析返回null
            } catch (Exception e) {
                return null; // 异常时返回null
            }
        }
    }

    // 员工实体类，对应Excel中的一行数据
    @Data
    static class ExcelEmployee {
        // 从Excel列映射的属性字段
        private Integer serialNumber;       // A列: 序号
        private String name;                // B列: 姓名
        private String nature;              // C列: 性质（外包/派遣等）
        private String superiorUnit;        // D列: 上级单位
        private String employmentUnit;      // E列: 用工单位
        private String recruitmentStatus;   // F列: 招聘情况
        private String area;                // G列: 地区
        private String position;            // H列: 岗位
        private Double basicSalary;         // I列: 基本工资
        private String gender;              // J列: 性别
        private String employmentStatus;    // K列: 在职状态
        private Date entryDate;             // L列: 入职日期
        private String contractSignMethod;  // M列: 合同签署方式
        private String contractExpiryReminder; // N列: 合同到期提醒
        private Integer renewalCount;       // O列: 续签次数
        private Date resignationDate;       // P列: 离职日期
        private Integer employmentDays;     // Q列: 在职天数
        private String contractSigned;      // R列: 合同签署状态
        private String socialSecurityLocation; // S列: 社保公积金缴纳地
        private String jobTitle;            // T列: 职位
        private String idNumber;            // U列: 身份证号
        private Date birthDate;             // V列: 出生日期
        private String education;           // W列: 学历
        private String ethnicity;           // X列: 民族
        private String maritalStatus;       // Y列: 婚姻状况
        private String householdType;       // Z列: 户口性质
        private String registeredAddress;   // AA列: 户籍所在地地址
        private String currentAddress;      // AB列: 现居住地地址
        private String email;               // AC列: 邮箱
        private String personalPhone;       // AD列: 本人联系方法
        private String emergencyContact;    // AE列: 第一紧急联系人电话
        private Integer probationPeriod;    // AF列: 试用期（月数）
        private Date probationEndDate;      // AG列: 试用期到期日
        private Integer contractTerm;       // AH列: 合同期（年数）
        private Date contractEndDate;       // AI列: 合同到期日
        private Integer age;                // AJ列: 年龄
        private String idCopy;              // AK列: 身份证复印件状态
        private String medicalReport;       // AL列: 体检报告状态
        private String educationCertificate; // AM列: 学历证明状态
        private String resignationCertificate; // AN列: 离职证明状态
        private String photo;               // AO列: 相片状态
        private String bank;                // AP列: 银行名称
        private String bankAccount;         // AQ列: 银行卡号
        private String otherBankAccount;    // AR列: 其他银行卡号
        private String employerLiabilityInsurance; // AS列: 雇主责任险信息
        // 可继续添加AT到AU列对应的属性...

        // Getter和Setter方法
        public Integer getSerialNumber() { return serialNumber; }
        public void setSerialNumber(Integer serialNumber) { this.serialNumber = serialNumber; }
        
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
        
        // 其他字段的getter/setter...
        public String getNature() { return nature; }
        public void setNature(String nature) { this.nature = nature; }
        
        public String getSuperiorUnit() { return superiorUnit; }
        public void setSuperiorUnit(String superiorUnit) { this.superiorUnit = superiorUnit; }
        
        // 为节省篇幅，省略部分getter/setter...
        // 实际使用时需要为所有字段添加完整的getter/setter方法

        // toString方法，方便调试和日志输出
        @Override
        public String toString() {
            return "Employee{" +
                   "serialNumber=" + serialNumber +
                   ", name='" + name + '\'' +
                   ", nature='" + nature + '\'' +
                   ", superiorUnit='" + superiorUnit + '\'' +
                   // 其他字段...
                   '}';
        }
    }
}